<?php

# -- DÉBUT NOTE DE LICENCE -------------------------------------
#
# Ce fichier fait partie de Clicpage.
#
# Copyright (c) 2010 Francois (www.clicpage.net)
# Distribué selon les termes de la licence GPL version 2.0.
# Consultez le fichier LICENCE ou
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- FIN NOTE DE LICENCE ---------------------------------------

class cpServicePages
{
	
	
	public static function getPages()
	{
		
		global $core;
		
		# --- Filtres ---
				
		$params = array();
		
		$cat = 0;
		
		# page_id: Une seule page est retournée
		$requete_id = false;
		if(!empty($_POST['page_id']) && is_numeric($_POST['page_id'])) {
			$requete_id = true;
			$params['page_id'] = (integer) $_POST['page_id'];
		}

		# rechercher: Recherche par mot-clé sur les pages
		if(!$requete_id && !empty($_POST['rechercher'])) {
			$params['rechercher'] = $_POST['rechercher'];
			$params['limit'] = 25;
			$_POST['cat_id'] = 'ignorer';
		}
		
		# cat_id: Afficher les pages d'une catégorie en particulier
		if(!$requete_id && (empty($_POST['cat_id']) || is_numeric($_POST['cat_id']))) {
			
			if(empty($_POST['cat_id'])) {
				$_POST['cat_id'] = 1;
			}
			
			$cat = $core->site->getCategories(array('cat_id' => (integer) $_POST['cat_id']), CP_GET_STATIC);
			
			if(!$cat->isEmpty()) {
				$params['cat_id'] = (integer) $_POST['cat_id'];
			}
		}
		
		# statut: Afficher les pages selon leur statut
		if(!$requete_id && $_POST['statut'] == 'brouillon') {
			$params['page_modifiee'] = CP_PAGEMODIFIEE_OUI;
		} elseif(!$requete_id && $_POST['statut'] == 'online') {
			$params['page_statut'] = CP_STATUT_ONLINE;
		} elseif(!$requete_id && $_POST['statut'] == 'offline') {
			$params['page_statut'] = CP_STATUT_OFFLINE;
		}
		
		# Ordonner les résultats
		if(!$requete_id) {
			$params['order'] = 'page_titre ASC';
		}
		
		
		# --- Requête base de données ---
		
		$rs = $core->site->getPages($params, CP_GET_RS);
		$pages = array();
		
		while($rs->fetch())
		{
			$pages[] = array(
				'page_id' => $rs->page_id,
				'page_statut' => $rs->page_statut,
				'page_modifiee' => $rs->page_modifiee,
				'page_url' => $rs->page_url,
				'page_titre' => $rs->page_titre,
				'page_date_modification' => cpDt::belleDate(array(), strtotime($rs->page_date_modification))
			);
		}
		
		$categories = array();
		$arborescence = '';
		
		if(is_object($cat) && !$cat->isEmpty())
		{
			$rs = $cat->getCategories(array(), CP_GET_RS);
			
			while($rs->fetch())
			{
				$categories[] = array(
					'cat_id' => (integer) $rs->cat_id,
					'cat_titre' => $rs->cat_titre
				);
			}
			
			$arborescenceData = $cat->getArborescence();
			$arborescence = '<p class="arborescence">';
			
			foreach($arborescenceData as $v)
			{
				$arborescence.=
					'<a class="lienArborescence" href="#" name="'.$v->cat_id.'">'.
						$v->cat_titre.
					'</a>';	
			}
			
			$arborescence.=
					'<a href="#" class="current">'.
						$cat->cat_titre.
					'</a>'.
				'</p>';
			
		}

		# --- Envoi des données ---
		
		return array(
			'erreur' 		=> 0,
			'arborescence' 	=> $arborescence,
			'pages' 		=> $pages,
			'categories' 	=> $categories
		);
		
	}
	
	public static function getComboCategories()
	{
		
		global $core;
		
		$comboCategories = $core->site->getComboCategories();
		
		if($_POST['self']) {
			$comboCategories = array_merge(array(
				__('[dossier actuel]') => '_self'
			), $comboCategories);
		}
		
		return array(
			'erreur' 	=> 0,
			'html' 		=> form::combo($_POST['nom'], $comboCategories)
		);
	}
	
	public static function getCategorie()
	{
		
		global $core;
		
		if(!isset($_POST['cat_id'])) {
			throw new cpErreur(__('Aucune sélection'), 'cat_id', 302);
		}
		
		$cat = $core->site->getCategories(array('cat_id' => (integer) $_POST['cat_id']), CP_GET_RS);
		
		if($cat->isEmpty()) {
			throw new cpErreur(__('Cette clé n\'existe pas dans la base de données.'), 'cat_id', 301);	
		}
		
		return array(
			'erreur'	=> 0,
			'cat_id'	=> $cat->cat_id,
			'cat_titre'	=> $cat->cat_titre,
			'cat_url'	=> $cat->cat_url
		);
		
	}
	
	public static function supprimer()
	{
		
		global $core;

		# Permission nécessaire: pages
		$core->auth->verifierPermission('pages', true);
		
		# Début de la transaction
		$core->con->begin();
		
		try {
		
			if(is_array($_POST['selection_pages']))
			{	
				foreach($_POST['selection_pages'] as $page_id)
				{	
					
					$page = $core->site->getPages(array('page_id' => (integer) $page_id), CP_GET_STATIC);
					
					if(!$page->isEmpty()) {
						
						//  ---------------------------------------
						//   Permissions
						//  ---------------------------------------
			
						# Si l'utilisateur actuel n'est pas l'auteur de la page
						if($page->utilisateur_id != $core->auth->getUtilisateurID()) {
							# Permission nécessaire: supprimerPage
							$core->auth->verifierPermission('supprimerPage', true);
						}
			
						//  ---------------------------------------
						
						if($page->isSiteHome()) {
							throw new cpErreur(__('Vous ne pouvez pas supprimer la page d\'accueil du site.'), null, 303);
						}
						
						$page->supprimer();
					}	
				}
			}
			
			if(is_array($_POST['selection_categories']))
			{
				
				# Permission nécessaire: supprimerCategorie
				$core->auth->verifierPermission('supprimerCategorie', true);
				
				foreach($_POST['selection_categories'] as $cat_id)
				{
					$categorie = $core->site->getCategories(array('cat_id' => (integer) $cat_id), CP_GET_STATIC);
					
					if(!$categorie->isEmpty()) {
						$categorie->supprimer();
					}	
				}
			}
			
			# Fin de la transaction
			$core->con->commit();
			
		} catch(Exception $e) {
			$core->con->rollback();
			throw $e;
		}
		
	}
	
	
	public static function definirAccueil()
	{
		
		global $core;
		
		# Permission nécessaire: toutesPages
		$core->auth->verifierPermission('toutesPages', true);
		
		if(empty($_POST['page_id']) || !is_numeric($_POST['page_id'])) {
			throw new cpErreur(__('Donnée invalide'), 'page_id', 302);
		}
		
		# Vérifier l'existence de la page
		$page = $core->site->getPages(array(
			'page_id' => (integer) $_POST['page_id']
		), CP_GET_RS);
		
		if($page->isEmpty()) {
			throw new cpErreur(__('Cette clé n\'existe pas dans la base de données.'), 'page_id', 301);
		}
		
		if($page->cat_id != (integer) $_POST['cat_id']) {
			throw new cpErreur(__('Donnée invalide'), 'cat_id', 301);
		}
		
		$cur = $core->con->openCursor($core->prefix.'categories');
		$cur->home_page_id = (integer) $page->page_id;
		$cur->update('WHERE cat_id = '.(integer) $_POST['cat_id']);
		
		if((integer) $_POST['cat_id'] == 1)
		{
			$cur = $core->con->openCursor($core->prefix.'site');
			$cur->valeur = (integer) $page->page_id;
			$cur->update("WHERE propriete = 'home_page_id' AND module='core'");
		}
		
	}
	
	
	public static function annulerAccueil()
	{
		
		global $core;
		
		# Permission nécessaire: toutesPages
		$core->auth->verifierPermission('toutesPages', true);
		
		if(empty($_POST['cat_id']) || !is_numeric($_POST['cat_id'])) {
			throw new cpErreur(__('Donnée invalide'), 'cat_id', 302);
		}
		
		$cur = $core->con->openCursor($core->prefix.'categories');
		$cur->home_page_id = null;
		$cur->update('WHERE cat_id = '.(integer) $_POST['cat_id'].' AND parent_cat_id != 0');
		
	}
	
	
	public static function deplacer()
	{
		
		global $core;
		
		# Permission nécessaire: pages
		$core->auth->verifierPermission('pages', true);
		
		# Début de la transaction
		$core->con->begin();
		
		try
		{
			
			# Vérifier le dossier de destination
			if(!is_numeric($_POST['deplacer_cat_id']) || empty($_POST['deplacer_cat_id'])) {
				throw new cpErreur(__('Donnée invalide'), 'deplacer_cat_id', 302);
			}
			$dest = $core->site->getCategories(array('cat_id' => (integer) $_POST['deplacer_cat_id']), CP_GET_STATIC);
			if($dest->isEmpty()) {
				throw new cpErreur(__('Donnée invalide'), 'deplacer_cat_id', 301);
			}
			
			# Déplacement des dossiers
			if(is_array($_POST['selection_categories']))
			{
				if(!$core->auth->verifierPermission('toutesPages')) {
					throw new cpErreur(__('Vous ne pouvez pas déplacer un dossier.'), 'toutesPages', 201);
				}
				
				$cur = $core->con->openCursor($core->prefix.'categories');
				$cur->parent_cat_id = (integer) $dest->cat_id;
				
				foreach($_POST['selection_categories'] as $cat_id)
				{
					try {
						$cat = $core->site->getCategories(array('cat_id' => (integer) $cat_id), CP_GET_STATIC);
						$cat->enregistrer($cur);
					} catch(Exception $e) {
						throw new cpErreur(sprintf(__('Vous ne pouvez pas déplacer le dossier %s à l\'intérieur de lui-même.'), '<em>'.html::escapeHTML($cat->cat_titre).'</em>'), 'selection_categories', 303);
					}
					
				}
			}
				
			# Déplacement des pages
			if(is_array($_POST['selection_pages']))
			{

				$cur_temp = $core->con->openCursor($core->prefix.'temp_pages');
				$cur_temp->cat_id = (integer) $dest->cat_id;
				$cur_pub = $core->con->openCursor($core->prefix.'pub_pages');
				$cur_pub->cat_id = (integer) $dest->cat_id;
				
				foreach($_POST['selection_pages'] as $page_id)
				{
					$page = $core->site->getPages(array('page_id' => (integer) $page_id), CP_GET_STATIC);

					if($page->isEmpty()) {
						throw new cpErreur(sprintf(__('Cette clé n\'existe pas dans la base de données.').' (%s)', $page->page_id), 'selection_pages', 301);
					}
					if(!$page->peutModifier()) {
						throw new cpErreur(sprintf(__('Vous ne pouvez pas déplacer la page %s car vous n\'en êtes pas l\'auteur.'), '<em>'.html::escapeHTML($page->page_titre).'</em>'), 'selection_pages', 201);
					}
					if($page->isCatHome()) {
						throw new cpErreur(__('Vous ne pouvez pas déplacer la page d\'accueil d\'un dossier.'), 'selection_pages', 303);
					}
					
					$cur_temp->update('WHERE page_id = '.(integer) $page->page_id);
					$cur_pub->update('WHERE page_id = '.(integer) $page->page_id);
					
				}
				
			}
			
			# Fin de la transaction
			$core->con->commit();
			
		}
		catch(Exception $e)	{
			$core->con->rollback();
			throw $e;
		}
		
	}
	
	
	public static function ajouterTag()
	{
		
		global $core;
		
		# Début de la transaction
		$core->con->begin();

		try
		{
			
			if(empty($_POST['tag_texte'])) {
				throw new cpErreur(__('Vous devez indiquer un tag.'), 'tag_texte', 101);
			}
			
			$_POST['tag_texte'] = trim($_POST['tag_texte']);
			
			# Plusieurs pages
			if(is_array($_POST['selection_pages']) && !empty($_POST['selection_pages'])) 
			{
				
				$pages = $core->site->getPages(array('page_id' => $_POST['selection_pages']), CP_GET_STATIC);
				
				if($pages->isEmpty()) {
					throw new cpErreur(__('Aucune sélection'), 'selection_pages', 302);
				}
				
				while($pages->fetch())
				{
					
					if(!$pages->peutModifier()) {
						throw new cpErreur(__('Vous ne pouvez pas modifier des pages dont vous n\'êtes pas l\'auteur.'), 'toutesPages', 201);
					}
					
					$pages->ajouterTag($_POST['tag_texte'], false);
				}
				
			}
			# Une seule page
			else
			{
				
				if(empty($_POST['page_id'])) {
					throw new cpErreur(__('Aucune sélection'), 'page_id', 302);
				}
				
				$page = $core->site->getPages(array('page_id' => $_POST['page_id']), CP_GET_STATIC);
				
				if($page->isEmpty()) {
					throw new cpErreur(sprintf(__('Cette clé n\'existe pas dans la base de données.').' (%s)', (integer) $_POST['page_id']), 'page_id', 301);
				}
				
				if(!$page->peutModifier()) {
					throw new cpErreur(__('Vous ne pouvez pas modifier des pages dont vous n\'êtes pas l\'auteur.'), 'toutesPages', 201);
				}
				
				# Ajouter le tag
				$page->ajouterTag($_POST['tag_texte']);
				
			}
			
			# Fin de la transaction
			$core->con->commit();
			
		}
		catch(Exception $e)	{
			$core->con->rollback();
			throw $e;
		}
		
		return array(
			'erreur' => 0,
			'tag_texte' => $_POST['tag_texte']
		);
		
	}
	
	
	public static function supprimerTag()
	{
		
		global $core;
		
		if(empty($_POST['tag_texte'])) {
			throw new cpErreur(__('Action invalide'), 'tag_texte', 302);
		}
		
		# Sélection de la page dans la DB
		if(empty($_POST['page_id'])) {
			throw new cpErreur(__('Aucune sélection'), 'page_id', 302);
		}
				
		$page = $core->site->getPages(array('page_id' => $_POST['page_id']), CP_GET_STATIC);
				
		if($page->isEmpty()) {
			throw new cpErreur(sprintf(__('Cette clé n\'existe pas dans la base de données.').' (%s)', (integer) $_POST['page_id']), 'page_id', 301);
		}
		
		# Permission
		if(!$page->peutModifier()) {
			throw new cpErreur(__('Vous ne pouvez pas modifier des pages dont vous n\'êtes pas l\'auteur.'), 'toutesPages', 201);
		}
		
		# Suppression du tag
		$page->supprimerTag($_POST['tag_texte']);
		
	}
	
	
	public static function getTags()
	{

		global $core;
		
		$rs = $core->site->getTags();
		
		while($rs->fetch()) {
			$tags[] = $rs->tag_texte;
		}
		
		return array(
			'erreur' => 0,
			'tags' => $tags
		);
		
	}
	
}

?>